﻿//===============================================================================
// Apolineo Patterns & Practices LeanEngine Framework
//===============================================================================
// Copyright © Apolineo Desenvolvimento de Sistemas Ltda.  All rights reserved.
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE.
//===============================================================================

using System;
using System.Collections.Generic;

using LeanEngine.Extensions;
using LeanEngine.Collections;
using LeanEngine.Business.Security;
using LeanEngine.Business.Security.Entity;

using LeanEngine.SalesConcept.Entity;

namespace LeanEngine.SalesConcept.Business
{
    //Classe que atua como um centralizador da comunicação
    //externa com os componentes internos e herda da classe
    //SecureContext do lob (Business.Security) para
    //autorizar os acessos as funcionalidades baseada no
    //perfil do usuário autenticado
    public sealed class SaleBusinessFacade : SecureContext
    {
        #region Constructor Members

        //O contrutor padrão da classe SecureContext requer o token
        //de acesso que o usuário recebe após o logon
        public SaleBusinessFacade(Token token) : base(token) { }

        #endregion

        #region Salesman Business Members

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public Salesman InsertSalesman(Salesman value)
        {
            if (value.IsNull()) throw new ArgumentNullException("value");
            return BOSalesman.Instance.Insert(value);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public Salesman UpdateSalesman(Salesman value)
        {
            if (value.IsNull()) throw new ArgumentNullException("value");
            return BOSalesman.Instance.Update(value);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public void DeleteSalesman(Salesman value)
        {
            if (value.IsNull()) throw new ArgumentNullException("value");
            BOSalesman.Instance.Delete(value);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public void DeleteSalesmanById(long key)
        {
            if (key.IsLessThan(1)) throw new ArgumentOutOfRangeException("key", key, "The key must be greater than or equal 1.");
            var dto = new Salesman() { Id = key };
            BOSalesman.Instance.Delete(dto);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public List<Salesman> ListAllSalesman()
        {
            return BOSalesman.Instance.ListAll();
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public PagedList<Salesman> ListSalesmanByPage(int pageIndex, int pageSize)
        {
            if (pageIndex.IsLessThan(0)) throw new ArgumentOutOfRangeException("pageIndex", pageIndex, "The pageIndex must be greater than or equal 0.");
            if (pageSize.IsLessThan(0)) throw new ArgumentOutOfRangeException("pageSize", pageSize, "The pageSize must be greater than or equal 0.");
            return BOSalesman.Instance.List(pageIndex, pageSize);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public PagedList<Salesman> ListSalesmanByPersonCriteria(PersonSearchCriteria criteria)
        {
            if (criteria.IsNull()) throw new ArgumentNullException("criteria");
            return BOSalesman.Instance.ListSalesmans(criteria);
        }

        #endregion

        #region Customer Business Members

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public Customer InsertCustomer(Customer value)
        {
            if (value.IsNull()) throw new ArgumentNullException("value");
            return BOCustomer.Instance.Insert(value);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public Customer UpdateCustomer(Customer value)
        {
            if (value.IsNull()) throw new ArgumentNullException("value");
            return BOCustomer.Instance.Update(value);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public void DeleteCustomer(Customer value)
        {
            if (value.IsNull()) throw new ArgumentNullException("value");
            BOCustomer.Instance.Delete(value);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public void DeleteCustomerById(long key)
        {
            if (key.IsLessThan(1)) throw new ArgumentOutOfRangeException("key", key, "The key must be greater than or equal 1.");
            var dto = new Customer() { Id = key };
            BOCustomer.Instance.Delete(dto);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public List<Customer> ListAllCustomer()
        {
            return BOCustomer.Instance.ListAll();
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public PagedList<Customer> ListCustomerByPage(int pageIndex, int pageSize)
        {
            if (pageIndex.IsLessThan(0)) throw new ArgumentOutOfRangeException("pageIndex", pageIndex, "The pageIndex must be greater than or equal 0.");
            if (pageSize.IsLessThan(0)) throw new ArgumentOutOfRangeException("pageSize", pageSize, "The pageSize must be greater than or equal 0.");
            return BOCustomer.Instance.List(pageIndex, pageSize);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public PagedList<Customer> ListCustomerByPersonCriteria(PersonSearchCriteria criteria)
        {
            if (criteria.IsNull()) throw new ArgumentNullException("criteria");
            return BOCustomer.Instance.ListCustomers(criteria);
        }

        #endregion

        #region Product Business Members

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public Product InsertProduct(Product value)
        {
            if (value.IsNull()) throw new ArgumentNullException("value");
            return BOProduct.Instance.Insert(value);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public Product UpdateProduct(Product value)
        {
            if (value.IsNull()) throw new ArgumentNullException("value");
            return BOProduct.Instance.Update(value);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public void DeleteProduct(Product value)
        {
            if (value.IsNull()) throw new ArgumentNullException("value");
            BOProduct.Instance.Delete(value);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public void DeleteProductById(long key)
        {
            if (key.IsLessThan(1)) throw new ArgumentOutOfRangeException("key", key, "The key must be greater than or equal 1.");
            var dto = new Product() { Id = key };
            BOProduct.Instance.Delete(dto);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public List<Product> ListAllProduct()
        {
            return BOProduct.Instance.ListAll();
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public PagedList<Product> ListProductByPage(int pageIndex, int pageSize)
        {
            if (pageIndex.IsLessThan(0)) throw new ArgumentOutOfRangeException("pageIndex", pageIndex, "The pageIndex must be greater than or equal 0.");
            if (pageSize.IsLessThan(0)) throw new ArgumentOutOfRangeException("pageSize", pageSize, "The pageSize must be greater than or equal 0.");
            return BOProduct.Instance.List(pageIndex, pageSize);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public PagedList<Product> ListProductByProductCriteria(ProductSearchCriteria criteria)
        {
            if (criteria.IsNull()) throw new ArgumentNullException("criteria");
            return BOProduct.Instance.ListProducts(criteria);
        }

        #endregion

        #region Sale Business Members

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public Sale DoSale(Sale value)
        {
            if (value.IsNull()) throw new ArgumentNullException("value");
            return BOSale.Instance.DoSale(value);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public void DeleteSaleById(long key)
        {
            if (key.IsLessThan(1)) throw new ArgumentOutOfRangeException("key", key, "The key must be greater than or equal 1.");
            BOSale.Instance.DeleteSale(key);
        }

        //Adicionando o atributo SecureBehavior definimos que os acessos
        //ao método serão controlados pelo lob e verificados se o perfil
        //do usuario possui acesso ao método (funcionalidade)
        [SecureBehavior()]
        public PagedList<Sale> ListSaleBySaleCriteria(SaleSearchCriteria criteria)
        {
            if (criteria.IsNull()) throw new ArgumentNullException("criteria");
            return BOSale.Instance.ListSales(criteria);
        }

        #endregion
    }
}
